From 3fa9804fc0aa14972d09590a69ff4ccd69a8f2d1 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 6 Mar 2026 15:25:14 +0200 Subject: [PATCH] [PATCH 12/24] lib-imap, global: Add params parameter to imap_parser_create() Gbp-Pq: Name CVE-2026-27857-2.patch --- src/imap-login/imap-login-client.c | 4 ++-- src/imap-login/imap-login-cmd-id.c | 4 +++- src/imap/cmd-append.c | 3 ++- src/imap/cmd-setmetadata.c | 3 ++- src/imap/imap-client.c | 3 ++- src/lib-imap-client/imapc-connection.c | 3 ++- src/lib-imap-storage/imap-msgpart.c | 2 +- src/lib-imap/imap-bodystructure.c | 4 ++-- src/lib-imap/imap-envelope.c | 2 +- src/lib-imap/imap-parser.c | 3 ++- src/lib-imap/imap-parser.h | 6 +++++- src/lib-imap/test-imap-parser.c | 8 ++++---- src/plugins/virtual/virtual-config.c | 2 +- 13 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/imap-login/imap-login-client.c b/src/imap-login/imap-login-client.c index a31be22..f24b90e 100644 --- a/src/imap-login/imap-login-client.c +++ b/src/imap-login/imap-login-client.c @@ -382,7 +382,7 @@ static int imap_client_create(struct client *client) imap_client->parser = imap_parser_create(imap_client->common.input, imap_client->common.output, - IMAP_LOGIN_MAX_LINE_LENGTH); + IMAP_LOGIN_MAX_LINE_LENGTH, NULL); struct settings_instance *set_instance = settings_instance_find(client->event); if (set_instance == NULL) { set_instance = settings_instance_new( @@ -468,7 +468,7 @@ static void imap_client_starttls(struct client *client) imap_client->parser = imap_parser_create(imap_client->common.input, imap_client->common.output, - IMAP_LOGIN_MAX_LINE_LENGTH); + IMAP_LOGIN_MAX_LINE_LENGTH, NULL); /* CRLF is lost from buffer when streams are reopened. */ imap_client->skip_line = FALSE; diff --git a/src/imap-login/imap-login-cmd-id.c b/src/imap-login/imap-login-cmd-id.c index 572f933..806486d 100644 --- a/src/imap-login/imap-login-cmd-id.c +++ b/src/imap-login/imap-login-cmd-id.c @@ -346,7 +346,9 @@ int cmd_id(struct imap_client *client) id->params->pool = param_pool; id->parser = imap_parser_create(client->common.input, client->common.output, - IMAP_LOGIN_MAX_LINE_LENGTH); + IMAP_LOGIN_MAX_LINE_LENGTH, + NULL); + id->log_reply = str_new(default_pool, 64); if (client->set->imap_literal_minus) imap_parser_enable_literal_minus(id->parser); parser_flags = IMAP_PARSE_FLAG_STOP_AT_LIST; diff --git a/src/imap/cmd-append.c b/src/imap/cmd-append.c index 3c29c1f..11da188 100644 --- a/src/imap/cmd-append.c +++ b/src/imap/cmd-append.c @@ -1063,7 +1063,8 @@ static bool cmd_append_full(struct client_command_context *cmd, bool replace) o_stream_unset_flush_callback(client->output); ctx->save_parser = imap_parser_create(client->input, client->output, - client->set->imap_max_line_length); + client->set->imap_max_line_length, + NULL); if (client->set->imap_literal_minus) imap_parser_enable_literal_minus(ctx->save_parser); diff --git a/src/imap/cmd-setmetadata.c b/src/imap/cmd-setmetadata.c index 4278c87..686c72c 100644 --- a/src/imap/cmd-setmetadata.c +++ b/src/imap/cmd-setmetadata.c @@ -289,7 +289,8 @@ cmd_setmetadata_start(struct imap_setmetadata_context *ctx) asynchronously the same way as APPEND does. */ client->input_lock = cmd; ctx->parser = imap_parser_create(client->input, client->output, - client->set->imap_max_line_length); + client->set->imap_max_line_length, + NULL); if (client->set->imap_literal_minus) imap_parser_enable_literal_minus(ctx->parser); o_stream_unset_flush_callback(client->output); diff --git a/src/imap/imap-client.c b/src/imap/imap-client.c index e2bbbc4..f8704ba 100644 --- a/src/imap/imap-client.c +++ b/src/imap/imap-client.c @@ -975,7 +975,8 @@ client_command_new(struct client *client) } else { cmd->parser = imap_parser_create(client->input, client->output, - client->set->imap_max_line_length); + client->set->imap_max_line_length, + NULL); if (client->set->imap_literal_minus) imap_parser_enable_literal_minus(cmd->parser); } diff --git a/src/lib-imap-client/imapc-connection.c b/src/lib-imap-client/imapc-connection.c index e770944..ac3d487 100644 --- a/src/lib-imap-client/imapc-connection.c +++ b/src/lib-imap-client/imapc-connection.c @@ -1876,7 +1876,8 @@ static void imapc_connection_connect_next_ip(struct imapc_connection *conn) o_stream_set_flush_callback(conn->output, imapc_connection_connected, conn); conn->parser = imap_parser_create(conn->input, NULL, - conn->client->set->imapc_max_line_length); + conn->client->set->imapc_max_line_length, + NULL); conn->to = timeout_add(conn->client->set->imapc_connection_timeout_interval_msecs, imapc_connection_timeout, conn); conn->to_output = timeout_add(conn->client->set->imapc_max_idle_time_secs*1000, diff --git a/src/lib-imap-storage/imap-msgpart.c b/src/lib-imap-storage/imap-msgpart.c index 7f1acb4..600fe41 100644 --- a/src/lib-imap-storage/imap-msgpart.c +++ b/src/lib-imap-storage/imap-msgpart.c @@ -149,7 +149,7 @@ imap_msgpart_get_header_fields(pool_t pool, const char *header_list, int result = 0; input = i_stream_create_from_data(header_list, strlen(header_list)); - parser = imap_parser_create(input, NULL, SIZE_MAX); + parser = imap_parser_create(input, NULL, SIZE_MAX, NULL); if (imap_parser_finish_line(parser, 0, 0, &args) > 0 && imap_arg_get_list_full(args, &hdr_list, &list_count) && diff --git a/src/lib-imap/imap-bodystructure.c b/src/lib-imap/imap-bodystructure.c index 4bacb49..ab30889 100644 --- a/src/lib-imap/imap-bodystructure.c +++ b/src/lib-imap/imap-bodystructure.c @@ -722,7 +722,7 @@ int imap_bodystructure_parse_full(const char *bodystructure, input = i_stream_create_from_data(bodystructure, strlen(bodystructure)); (void)i_stream_read(input); - parser = imap_parser_create(input, NULL, SIZE_MAX); + parser = imap_parser_create(input, NULL, SIZE_MAX, NULL); ret = imap_parser_finish_line(parser, 0, IMAP_PARSE_FLAG_LITERAL_TYPE, &args); if (ret < 0) { @@ -972,7 +972,7 @@ int imap_body_parse_from_bodystructure(const char *bodystructure, input = i_stream_create_from_data(bodystructure, strlen(bodystructure)); (void)i_stream_read(input); - parser = imap_parser_create(input, NULL, SIZE_MAX); + parser = imap_parser_create(input, NULL, SIZE_MAX, NULL); ret = imap_parser_finish_line(parser, 0, IMAP_PARSE_FLAG_NO_UNESCAPE | IMAP_PARSE_FLAG_LITERAL_TYPE, &args); if (ret < 0) { diff --git a/src/lib-imap/imap-envelope.c b/src/lib-imap/imap-envelope.c index da31770..f1408a7 100644 --- a/src/lib-imap/imap-envelope.c +++ b/src/lib-imap/imap-envelope.c @@ -222,7 +222,7 @@ bool imap_envelope_parse(const char *envelope, input = i_stream_create_from_data(envelope, strlen(envelope)); (void)i_stream_read(input); - parser = imap_parser_create(input, NULL, SIZE_MAX); + parser = imap_parser_create(input, NULL, SIZE_MAX, NULL); ret = imap_parser_finish_line(parser, 0, IMAP_PARSE_FLAG_LITERAL_TYPE, &args); if (ret < 0) { diff --git a/src/lib-imap/imap-parser.c b/src/lib-imap/imap-parser.c index 643f80c..532cb97 100644 --- a/src/lib-imap/imap-parser.c +++ b/src/lib-imap/imap-parser.c @@ -69,7 +69,8 @@ struct imap_parser { struct imap_parser * imap_parser_create(struct istream *input, struct ostream *output, - size_t max_line_size) + size_t max_line_size, + const struct imap_parser_params *params ATTR_UNUSED) { struct imap_parser *parser; diff --git a/src/lib-imap/imap-parser.h b/src/lib-imap/imap-parser.h index cd3748c..16ef2c7 100644 --- a/src/lib-imap/imap-parser.h +++ b/src/lib-imap/imap-parser.h @@ -38,6 +38,9 @@ enum imap_parser_error { IMAP_PARSE_ERROR_LITERAL_TOO_BIG }; +struct imap_parser_params { +}; + struct imap_parser; /* Create new IMAP argument parser. output is used for sending command @@ -53,7 +56,8 @@ struct imap_parser; 2 * max_line_size. */ struct imap_parser * imap_parser_create(struct istream *input, struct ostream *output, - size_t max_line_size) ATTR_NULL(2); + size_t max_line_size, + const struct imap_parser_params *params); void imap_parser_ref(struct imap_parser *parser); void imap_parser_unref(struct imap_parser **parser); diff --git a/src/lib-imap/test-imap-parser.c b/src/lib-imap/test-imap-parser.c index 8a09422..cff2b38 100644 --- a/src/lib-imap/test-imap-parser.c +++ b/src/lib-imap/test-imap-parser.c @@ -16,7 +16,7 @@ static void test_imap_parser_crlf(void) test_begin("imap parser crlf handling"); input = test_istream_create(test_input); - parser = imap_parser_create(input, NULL, 1024); + parser = imap_parser_create(input, NULL, 1024, NULL); /* must return -2 until LF is read */ for (i = 0; test_input[i] != '\n'; i++) { @@ -60,7 +60,7 @@ static void test_imap_parser_partial_list(void) test_begin("imap parser partial list"); input = test_istream_create(test_input); - parser = imap_parser_create(input, NULL, 1024); + parser = imap_parser_create(input, NULL, 1024, NULL); (void)i_stream_read(input); test_assert(imap_parser_read_args(parser, 0, @@ -128,7 +128,7 @@ static void test_imap_parser_read_tag_cmd(void) if (tests[i].type != COMMAND) { input = test_istream_create(tests[i].input); test_assert(i_stream_read(input) > 0); - parser = imap_parser_create(input, NULL, 1024); + parser = imap_parser_create(input, NULL, 1024, NULL); ret = imap_parser_read_tag(parser, &atom); test_assert_idx(ret == tests[i].ret, i); test_assert_idx(ret <= 0 || strcmp(tests[i].tag, atom) == 0, i); @@ -139,7 +139,7 @@ static void test_imap_parser_read_tag_cmd(void) if (tests[i].type != TAG) { input = test_istream_create(tests[i].input); test_assert(i_stream_read(input) > 0); - parser = imap_parser_create(input, NULL, 1024); + parser = imap_parser_create(input, NULL, 1024, NULL); ret = imap_parser_read_command_name(parser, &atom); test_assert_idx(ret == tests[i].ret, i); test_assert_idx(ret <= 0 || strcmp(tests[i].tag, atom) == 0, i); diff --git a/src/plugins/virtual/virtual-config.c b/src/plugins/virtual/virtual-config.c index 44e024b..0faf09e 100644 --- a/src/plugins/virtual/virtual-config.c +++ b/src/plugins/virtual/virtual-config.c @@ -54,7 +54,7 @@ virtual_search_args_parse(const string_t *rule, const char **error_r) input = i_stream_create_from_data(str_data(rule), str_len(rule)); (void)i_stream_read(input); - imap_parser = imap_parser_create(input, NULL, SIZE_MAX); + imap_parser = imap_parser_create(input, NULL, SIZE_MAX, NULL); ret = imap_parser_finish_line(imap_parser, 0, 0, &args); if (ret < 0) { sargs = NULL; -- 2.30.2